🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / app / src / main / java / com / geeksville / mesh / util / Extensions.kt
Displaying Raw • Download
app/src/main/java/com/geeksville/mesh/util/Extensions.kt ui_message_list (be3f882f) Text, 3.67 KB
T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787com.geeksville.mesh.util
Tff7b72import T7ee787android.widget.EditText
Tff7b72import T7ee787com.geeksville.mesh.BuildConfig
Tff7b72import T7ee787com.geeksville.mesh.ConfigProtos
Tff7b72import T7ee787com.geeksville.mesh.MeshProtos
T8b949e/**
* When printing strings to logs sometimes we want to print useful debugging information about users or positions. But
* we don't want to leak things like usernames or locations. So this function if given a string, will return a string
* which is a maximum of three characters long, taken from the tail of the string. Which should effectively hide real
* usernames and locations, but still let us see if values were zero, empty or different.
*/
Tff7b72val Te6edf3AnyTff7b72?.Te6edf3anonymizeTb4b4b4: Tffa657String
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Tff7b72thisTb4b4b4.Te6edf3anonymizeTb4b4b4(Tb4b4b4)
T8b949e/** A version of anonymize that allows passing in a custom minimum length */
Tff7b72fun Td2a8ffAnyTff7b72?.Te6edf3anonymizeTb4b4b4(Te6edf3maxLenTb4b4b4: Tffa657Int Tff7b72= T79c0ff3Tb4b4b4) Tff7b72= Tff7b72if Tb4b4b4(Tff7b72this Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4(Ta5d6ff"Ta5d6ff...Ta5d6ff" Tff7b72+ Tff7b72thisTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3takeLastTb4b4b4(Te6edf3maxLenTb4b4b4)Tb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ffnullTa5d6ff"
T8b949e// A toString that makes sure all newlines are removed (for nice logging).
Tff7b72fun Te6edf3AnyTb4b4b4.Td2a8fftoOneLineStringTb4b4b4(Tb4b4b4) Tff7b72= Tff7b72thisTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff'\n'Tb4b4b4, Ta5d6ff' 'Tb4b4b4)
Tff7b72fun Te6edf3ConfigProtosTb4b4b4.Td2a8ffConfigTb4b4b4.Te6edf3toOneLineStringTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3redactedFields Tff7b72= Ta5d6ff"""Ta5d6ff(wifi_psk:|public_key:|private_key:|admin_key:)Ta5d6ff\Ta5d6ffs*Ta5d6ff"Ta5d6ff.*Ta5d6ff"""
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Te6edf3redactedFieldsTb4b4b4.Te6edf3toRegexTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Ta5d6ff"Tffd700${Tffa657itTb4b4b4.Te6edf3groupValuesTff7b72[T79c0ff1Tff7b72]Tffd700}Ta5d6ff Ta5d6ff\"Ta5d6ff[REDACTED]Ta5d6ff\"Ta5d6ff" Tb4b4b4}
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff'\n'Tb4b4b4, Ta5d6ff' 'Tb4b4b4)
Tb4b4b4}
Tff7b72fun Te6edf3MeshProtosTb4b4b4.Td2a8fftoOneLineStringTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3redactedFields Tff7b72= Ta5d6ff"""Ta5d6ff(public_key:|private_key:|admin_key:)Ta5d6ff\Ta5d6ffs*Ta5d6ff"Ta5d6ff.*Ta5d6ff""" T8b949e// Redact keys
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Te6edf3redactedFieldsTb4b4b4.Te6edf3toRegexTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Ta5d6ff"Tffd700${Tffa657itTb4b4b4.Te6edf3groupValuesTff7b72[T79c0ff1Tff7b72]Tffd700}Ta5d6ff Ta5d6ff\"Ta5d6ff[REDACTED]Ta5d6ff\"Ta5d6ff" Tb4b4b4}
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff'\n'Tb4b4b4, Ta5d6ff' 'Tb4b4b4)
Tb4b4b4}
T8b949e// Return a one line string version of an object (but if a release build, just say 'might be PII)
Tff7b72fun Te6edf3AnyTb4b4b4.Td2a8fftoPIIStringTb4b4b4(Tb4b4b4) Tff7b72= Tff7b72if Tb4b4b4(Tff7b72!Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ff<PII?>Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3toOneLineStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72fun Te6edf3ByteArrayTb4b4b4.Td2a8fftoHexStringTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ff%02xTa5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffformatAgoTb4b4b4(Te6edf3lastSeenUnixTb4b4b4: Tffa657IntTb4b4b4, Te6edf3currentTimeMillisTb4b4b4: Tffa657Long Tff7b72= Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3currentTime Tff7b72= Tb4b4b4(Te6edf3currentTimeMillis Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3diffMin Tff7b72= Tb4b4b4(Te6edf3currentTime Tff7b72- Te6edf3lastSeenUnixTb4b4b4) Tff7b72/ T79c0ff6T79c0ff0
Tff7b72return Tff7b72when Tb4b4b4{
Te6edf3diffMin Tff7b72< T79c0ff1 Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffnowTa5d6ff"
Te6edf3diffMin Tff7b72< T79c0ff6T79c0ff0 Tff7b72-Tff7b72> Te6edf3diffMinTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff minTa5d6ff"
Te6edf3diffMin Tff7b72< T79c0ff2T79c0ff8T79c0ff8T79c0ff0 Tff7b72-Tff7b72> Tb4b4b4(Te6edf3diffMin Tff7b72/ T79c0ff6T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff hTa5d6ff"
Te6edf3diffMin Tff7b72< T79c0ff1T79c0ff4T79c0ff4T79c0ff0T79c0ff0T79c0ff0T79c0ff0 Tff7b72-Tff7b72> Tb4b4b4(Te6edf3diffMin Tff7b72/ Tb4b4b4(T79c0ff6T79c0ff0 Tff7b72* T79c0ff2T79c0ff4Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff dTa5d6ff"
Tff7b72else Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff?Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72const Tff7b72val Te6edf3MPS_TO_KMPH Tff7b72= T79c0ff3.6f
Tff7b72private Tff7b72const Tff7b72val Te6edf3KM_TO_MILES Tff7b72= T79c0ff0.621371f
Tff7b72fun Te6edf3IntTb4b4b4.Td2a8ffmpsToKmphTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Float Tb4b4b4{
T8b949e// Convert meters per second to kilometers per hour
Tff7b72val Te6edf3kmph Tff7b72= Tff7b72this Tff7b72* Te6edf3MPS_TO_KMPH
Tff7b72return Te6edf3kmph
Tb4b4b4}
Tff7b72fun Te6edf3IntTb4b4b4.Td2a8ffmpsToMphTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Float Tb4b4b4{
T8b949e// Convert meters per second to miles per hour
Tff7b72val Te6edf3mph Tff7b72= Tff7b72this Tff7b72* Te6edf3MPS_TO_KMPH Tff7b72* Te6edf3KM_TO_MILES
Tff7b72return Te6edf3mph
Tb4b4b4}
T8b949e// Allows usage like email.onEditorAction(EditorInfo.IME_ACTION_NEXT, { confirm() })
Tff7b72fun Te6edf3EditTextTb4b4b4.Td2a8ffonEditorActionTb4b4b4(Te6edf3actionIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3funcTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3setOnEditorActionListener Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3receivedActionIdTb4b4b4, Te6edf3_ Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3actionId Tff7b72=Tff7b72= Te6edf3receivedActionIdTb4b4b4) Tb4b4b4{
Te6edf3funcTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72true
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.05s